package com.zhl.Test;

import java.util.Random;
import java.util.Scanner;

public class TestDemo2 {
    public static void main(String[] args) {
        //目标：生成随机验证码
        /*
        需求：开发一个程序，可以生成指定位数的验证码，每位可以是数字、大小写字母。
             分析：
            1.使用方法进行：
                需要输入数据：验证码位数
            2.生成验证码，并返回数据
            3.方法内部的业务：使用for循环依次生成每位随机字符，并使用一个String类的变量把每个字符连接起来，最后返回该变量即可。
         */
        System.out.println("请输入你需要生成的验证码位数：");
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        //调用方法，生成验证码,并接收返回值
        String code = generateRandomCode(length);
        //打印验证码
        System.out.println("验证码为：" + code);

    }

    public static String generateRandomCode(int length) {
        //1.定义一个for循环，控制产生验证码的位数
        Random r = new Random();
        //2.定义一个String变量，用于保存生成的验证码
        String code = "";
        //思路：先随机生成0\1\2，用于决定生成数字/大写字母/小写字母
        for (int i = 0; i < length; i++)
        {
            int type = r.nextInt(3);// 生成0\1\2
            //用switch语句来判断类型，并随机生成对应字符
            switch (type) {
                case 0:
                    //生成数字
                    int num = r.nextInt(10);    //生成0-9之间的随机数
                    code += num;  //因为 code 是 String 类型，所以可以直接 += 数字 进行字符串拼接
                    break;
                case 1:
                    //生成大写字母，由于random只能生成随机数，所以利用ASCII码进行转换，即char类型 强制类型转换
                    // A = 65, Z = 90 = 65 + 26
                    int char1 = r.nextInt(26) + 65; //即生成65-90之间的随机数
                    char c1 = (char) char1; //强制类型转换为char类型
                    code += c1;
                    break;
                case 2:
                    //生成小写字母，同上 97-122
                    char char2 = (char)(r.nextInt(26) + 97); //将两步 合成一步
                    code += char2;
                    break;
            }
        }
        //3.返回生成的验证码
        return code;
    }
}
